/*
 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, this list of
 *    conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
 *    of conditions and the following disclaimer in the documentation and/or other materials
 *    provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
 *    to endorse or promote products derived from this software without specific prior written
 *    permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _TARGET_CONFIG_H
#define _TARGET_CONFIG_H

#include <stdint.h>
#include "irqs-sun20iw2p1.h"  ////
#include "core_cm33.h"

#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */

/* =============================================================================
                                        System clock module configuration
                                        系统时钟模块配置参数
============================================================================= */
//OS_SYS_CLOCK是配置LiteOS-M的时钟为系统时钟的参数,单位是hz
//AT43F437ZMT7系统时钟为288MHz
#define OS_SYS_CLOCK                                        288*1000*1000
//LOSCFG_BASE_CORE_TICK_PER_SECOND表示操作系统每秒钟产生Tick的数量，Tick是指操作系 统节拍的时钟周期。时钟节拍就是系统以固定的频率产生中断（时基中断），并在中断中处理与时间相关的事件，推动所有任务 向前运行。时钟节拍需要依赖于硬件定时器
//在LiteOS-M中，系统延时和阻塞时间都是以Tick为单位的，配置LOSCFG_BASE_CORE_TICK_PER_SECOND 的值可以改变中断的频率，从而间接改变LiteOS的时钟周期（T=1/f）。如果将LOSCFG_BASE_CORE_TICK_PER_SECOND的值设置为1000， 那么LiteOS-M的时钟周期为1ms。过高的系统节拍中断频率意味着LiteOS-M内核将占用更多的CPU时间，因此会降低效率，一般将 LOSCFG_BASE_CORE_TICK_PER_SECOND的值设置为50~1000即可。
#define LOSCFG_BASE_CORE_TICK_PER_SECOND                    (1000UL)
//定时器裁剪的外部配置项。
#define LOSCFG_BASE_CORE_TICK_HW_TIME                       0
#define LOSCFG_BASE_CORE_TICK_WTIMER                        0
#define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX                  (20000)

/* =============================================================================
                                        Hardware interrupt module configuration
                                        硬件外部中断模块配置参数
============================================================================= */
//LOSCFG_PLATFORM_HWI是硬件中断定制配置参数，YES表明LiteOS-M接管了外部中断，一般建议设置为NO，即不接管中断。
#define LOSCFG_PLATFORM_HWI                                 0
// 是否使用OS默认的中断。1接管，0不接管。
#define LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT                 0   
//LOSCFG_PLATFORM_HWI_LIMIT这个宏定义表示 LiteOS-M支持最大的外部中断数，默认为96，一般不作修改，使用默认即可。
#define LOSCFG_PLATFORM_HWI_LIMIT                           0x200
/* =============================================================================
                                       Task module configuration
                                        任务模块的配置。
============================================================================= */

//LOSCFG_BASE_CORE_TSK_LIMIT这个宏定义表示LiteOS支持的最大任务个数（除去空闲任务），默认为15。
#define LOSCFG_BASE_CORE_TSK_LIMIT                          60
//LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE这个宏定义表示空闲任务的栈大小，默认为0x500U字节
#define LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE                (0x600U)
//LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE宏定义表示定义默认的任务栈大小为0x2D0U字节，在任务创建的时候一般都会指定任务栈的大小，以适 配不一样的应用任务，而如果没有指定则使用默认值。
#define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE             (0x800U)
//LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE这个宏定义则表示任务最小需要的栈大小，栈大小应该是一个 合理的值，如果大小太大，可能会导致内存耗尽，最小的栈大小默认为0x130U。
#define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE                 (0x100U)
//LOSCFG_BASE_CORE_TIMESLICE这个宏定义表示是否使用时间片，在LiteOS-M一般都会使用时间片，故配置为YES。
#define LOSCFG_BASE_CORE_TIMESLICE                          1
//LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT这个宏定义表示具有相同优先级的任务的最长执行时间，单位为时钟节拍周期，默认配置为10。
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT                  1000
//LOSCFG_BASE_CORE_TSK_MONITOR这个宏定义表示任务栈监控模块定制的配置项，在LiteOS-M中默认打开。
#define LOSCFG_BASE_CORE_TSK_MONITOR                        1
#define LOSCFG_EXC_HARDWARE_STACK_PROTECTION                0
/* =============================================================================
                                       Semaphore module configuration
                                       信号量模块配置，信号量用于任务间的IPC通信，或者是用于任务与任务间的同步， 任务与中断间的同步等。
============================================================================= */
//LOSCFG_BASE_IPC_SEM这个宏定义表示信号量的配置项，配置为YES则表示默认使用信号量。
#define LOSCFG_BASE_IPC_SEM                                 1
//LOSCFG_BASE_IPC_SEM_LIMIT这个宏定义表示LiteOS-M最大支持信号量的个数，默认为20个，用户可以自定义设置信号量个数。
#define LOSCFG_BASE_IPC_SEM_LIMIT                           48
/*=============================================================================
                                       Mutex module configuration
                                       是互斥锁模块配置，互斥锁在LiteOS中起不可缺少的作用，如果某资源同时只准一个任务 访问，可以用互斥锁保护这个资源，互斥锁还具有优先级继承机制。
============================================================================= */
//LOSCFG_BASE_IPC_MUX这个宏定义表示互斥锁的配置项，配置为YES则表示默认使用互斥锁。
#define LOSCFG_BASE_IPC_MUX                                 1
//LOSCFG_BASE_IPC_MUX_LIMIT这个宏定义表示LiteOS-M最大支持互斥锁的个数，默认为15。
#define LOSCFG_BASE_IPC_MUX_LIMIT                           32
/*=============================================================================
                                       Queue module configuration
                                       消息队列模块配置，消息队列也是IPC通信的一种，用于任务与任务之间，任务与中断直接 的通信，可以存储有限的、大小固定的数据。
============================================================================= */
//队列功能开关，1表示打开，0表示关闭
//LOSCFG_BASE_IPC_QUEUE这个宏定义表示队列量的配置项，配置为YES则表示默认使用消息队列。
#define LOSCFG_BASE_IPC_QUEUE                               1
//LOSCFG_BASE_IPC_QUEUE_LIMIT这个宏定义表示LiteOS-M最大支持消息队列量的个数，默认为10。
#define LOSCFG_BASE_IPC_QUEUE_LIMIT                         24
/*=============================================================================
                                       Software timer module configuration
                                       软件定时器模块配置，使用软件定时器则必须要使用消息队列，否则不会使用软件定时器。
============================================================================= */
//软件定时器特性开关，1表示打开，0表示关闭
//LOSCFG_BASE_CORE_SWTMR这个宏定义表示软件定时器的配置项，配置为YES则表示默认使用软件定时器。
#define LOSCFG_BASE_CORE_SWTMR                              1
//对齐软件定时器特性开，1表示打开，依赖软件定时器特性打开，0表示关闭
#define LOSCFG_BASE_CORE_SWTMR_ALIGN                        0
//LOSCFG_BASE_CORE_SWTMR_LIMIT这个宏定义表示支持的最大软件定时器数量，而不是可用的软件定时器数量。默认为16。
#define LOSCFG_BASE_CORE_SWTMR_LIMIT                        5
/*=============================================================================
                                       Memory module configuration
                                       内存模块的配置项。
============================================================================= */
//声明了外部定义的一些变量，__heap_start为系统的起始地址，__heap_end为系统的结束地址，系统管理的内存均在这两个地址之间。
extern unsigned int __heap_start;
extern unsigned int __heap_size;
//这个宏决定系统是使用内核的内部堆内存还是用户的堆内存，默认为0（即使用内部的堆内存），大小为0x10000；如果用户需要基于外部的堆内存，那么可以将该宏设置为1。
#define LOSCFG_SYS_EXTERNAL_HEAP                            1
//系统的内存起始地址。
#define LOSCFG_SYS_HEAP_ADDR                                (void *)(UINTPTR)(0x8000000)
//系统的内存大小，大小为结束地址-起始地址+1。
#define LOSCFG_SYS_HEAP_SIZE                                3072*1024                //SRAM 384 kb（出厂默认），最大可设定为 512
//LOSCFG_MEM_MUL_POOL这个宏定义是配置内存模块内存池检查，默认打开。
#define LOSCFG_MEM_MUL_POOL                                 0
#define OS_SYS_MEM_NUM                                      20
#define LOSCFG_MEM_FREE_BY_TASKID                           0
//LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK这个宏定义是配置内存节点完整性检查，默认打开。
#define LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK                0
#define LOSCFG_STACK_POINT_ALIGN_SIZE                       4
/* =============================================================================
                                        Exception module configuration
============================================================================= */
//打印特性开关，1表示打开，0表示关闭
#define LOSCFG_KERNEL_PRINTF                                1

#define LOSCFG_SUPPORT_LITTLEFS                             0

#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */

#endif /* _TARGET_CONFIG_H */